/*
 *  $Id: CursorDescriptor.cs 1203 2010-11-22 18:41:11Z thenn.erannor $
 *  This file is a part of Ragima CCG.
 *  (C) 2008-2010 Ragima development group.
 *
 *  Licensed under the terms of the GNU GPL License version 2.
 *
 */

using System.Collections.Generic;

using AgateLib.Geometry;

using Nereal.Serialization;

namespace Ragima.UI {
    /// <summary>
    /// Расширенный описатель спрайтов: дополнительное поле для смещения курсора.
    /// </summary>
    [XmlRootName("cursor"), ConstructorParameters("Start", "Size", "Orientation", "Cols", "Rows", "Offset")]
    public class CursorDescriptor : SpriteDescriptor {
        private Point _offset;

        public CursorDescriptor(Point start, Size size, SpriteOrientation orientation, int cols, int rows, Point offset) : base(start, size, orientation, cols, rows) {
            _offset = offset;
        }

        [XmlName("offset"), DefaultValue("0 0")]
        public Point Offset {
            get { return _offset; }
        }
    }

    /// <summary>
    /// Список описателей курсоров, идентифицируемых по ID.
    /// </summary>
    [XmlRootName("cursors")]
    public class CursorDescriptorList : DescriptorList<CursorDescriptor> {
        [XmlName(null, "cursor")]
        public override Dictionary<string, CursorDescriptor> Descriptors {
            get { return base.Descriptors; }
        }
    }

    /// <summary>
    /// Поверхность с курсорами, загружается вместе с описателями курсоров.
    /// </summary>
    public class CursorSurface : DescriptedSurface<CursorDescriptor, CursorDescriptorList> {
        public CursorSurface(string surfName) : base(surfName) {
        }

        /// <summary>
        /// Получает курсор по идентификатору.
        /// </summary>
        public Cursor GetCursor(string id) {
            return new Cursor(id, this);
        }

        /// <summary>
        /// Загружает поверхность с курсорами из указанного файла.
        /// </summary>
        public static object LoadData(string filename) {
            return new CursorSurface(filename);
        }
    }
}
